package main

import (
	"fmt"
	"net"
)

func main() {
	// 1. DNS A记录 - A (Address) 记录是用来指定主机名（或域名）对应的IP地址记录
	iprecords, _ := net.LookupIP("jd.com")
	// fmt.Println(iprecords)
	for _, ip := range iprecords {
		fmt.Println(ip)
	}

	// 2. DNS CNAME记录 - 别名记录(区分服务)
	cname, _ := net.LookupCNAME("m.jd.com")
	fmt.Println(cname)

	// 3. DNS PTR记录 - 反向地址解析
	ptr, err := net.LookupAddr("114.114.114.114")
	if err != nil {
		fmt.Println(err)
	}
	for _, ptrvalue := range ptr {
		fmt.Println(ptrvalue)
	}

	// 4. DNS NS记录 - A记录和NS记录的区别是，A记录直接给出目的IP， NS记录将DNS解析任务交给特定的服务器， NS记录中记录的IP即为该特定服务器的IP地址
	nameserver, _ := net.LookupNS("baidu.com")
	for _, ns := range nameserver {
		fmt.Println(ns)
	}

	// 5. DNS MX记录 - 邮件交换记录 (MX record)是域名系统（DNS）中的一种资源记录类型，用于指定负责处理发往收件人域名的邮件服务器。 MX记录允许设置一个优先级，当多个邮件服务器可用时，会根据该值决定投递邮件的服务器。简单邮件传输协议（SMTP）会根据MX记录的值来决定邮件的路由过程。
	// 使用Go语言标准库 net.LookupMX 函数将域名作为字符串，并返回按首选项排序的MX 结构体的切片. MX结构由主机作为string组成，Pref是uint16.
	mxrecords, _ := net.LookupMX("baidu.com")
	for _, mx := range mxrecords {
		fmt.Println(mx.Host, mx.Pref)
	}

	// 6. DNS SRV记录 - SRV记录（英語：Service Record，中文又名服务定位记录）是域名系统中用于指定服务器提供服务的位置（如主机名和端口）数据。此数据于RFC 2782中定义，类型代码为33。 部分协议，如会话发起协议（SIP）及可扩展消息与存在协议（XMPP）通常需要服务记录的支持。
	// Go语言标准库LookupSRV函数尝试指定服务的SRV查询，协议和域名的SRV查询. 第二个参数是“tcp”或“udp”. 返回的记录按优先级排序，并按优先级在权重随机分配.
	cname, srvs, err := net.LookupSRV("xmpp-server", "tcp", "golang.org")
	if err != nil {
		panic(err)
	}

	fmt.Printf("\ncname: %s \n\n", cname)

	for _, srv := range srvs {
		fmt.Printf("%v:%v:%d:%d\n", srv.Target, srv.Port, srv.Priority, srv.Weight)
	}

	// 7. DNS TXT记录
	txtrecords, _ := net.LookupTXT("baidu.com")

	for _, txt := range txtrecords {
		fmt.Println(txt)
	}
}
